package postgres

import (
	"context"
	"gorm.io/gorm"
	"manager/model"
	"manager/model/entity"
)

var AlarmType = &alarmType{}

type alarmType struct{}

// Create 创建
func (a *alarmType) Create(ctx context.Context, m *entity.AlarmType) (int64, error) {
	err := GetDB(ctx).Create(m).Error
	return m.Id, err
}

// Find 查找详情
func (a *alarmType) Find(ctx context.Context, in *model.AlarmTypeInfoRequest) (*entity.AlarmType, error) {
	e := &entity.AlarmType{}
	if in.Id > 0 {
		err := GetDB(ctx).Model(&entity.AlarmType{}).First(&e, in.Id).Error
		return e, err
	}

	err := GetDB(ctx).Model(&entity.AlarmType{}).Where("code = ?", in.Code).First(&e).Error
	return e, err
}

// Update 更新
func (a *alarmType) Update(ctx context.Context, id int64, dict map[string]interface{}) error {
	return GetDB(ctx).Model(&entity.AlarmType{}).Where("id = ?", id).Updates(dict).Error
}

// Delete 删除
func (a *alarmType) Delete(ctx context.Context, id int64) error {
	return GetDB(ctx).Delete(&entity.AlarmType{}, id).Error
}

// List 列表查询
func (a *alarmType) List(ctx context.Context, in *model.AlarmTypeListRequest) (int, []*entity.AlarmType, error) {
	var (
		q          = GetDB(ctx).Model(&entity.AlarmType{})
		err        error
		total      int64
		alarmTypes []*entity.AlarmType
	)

	if in.Name != nil {
		q = q.Where("name = ?", in.Name)
	}

	if in.Content != nil {
		q = q.Where("content = ?", in.Content)
	}

	if in.Low != nil {
		q = q.Where("low = ?", in.Low)
	}

	if in.High != nil {
		q = q.Where("high = ?", in.High)
	}

	if in.UpdatedAt != nil {
		q = q.Where("updated_at = ?", in.UpdatedAt)
	}

	if err = q.Count(&total).Error; err != nil {
		return 0, nil, err
	}
	if err = q.Order("created_at desc").Limit(in.Size).Offset((in.Index - 1) * in.Size).Find(&alarmTypes).Error; err != nil {
		return 0, nil, err
	}
	return int(total), alarmTypes, nil
}

// ExecTransaction db事务执行
func (a *alarmType) ExecTransaction(ctx context.Context, callback func(ctx context.Context) error) error {
	return GetDB(ctx).Transaction(func(tx *gorm.DB) error {
		ctx = context.WithValue(ctx, DBCONTEXTKEY, tx)
		return callback(ctx)
	})
}
